package com.loong.system.handler;

import com.alibaba.fastjson.JSONArray;
import com.loong.common.domain.Pager;
import com.loong.common.exception.GlobalException;
import com.loong.common.executor.BatchExecutor;
import com.loong.common.mybatis.tools.PageTools;
import com.loong.common.utils.TransformUtils;
import com.loong.system.business.SystemLetterTemplateBusiness;
import com.loong.system.common.backend.param.SystemLetterTemplateParam;
import com.loong.system.common.backend.param.SystemLetterTemplateQueryParam;
import com.loong.system.common.backend.result.SystemLetterTemplateResult;
import com.loong.system.mapper.SystemLetterMapper;
import com.loong.system.model.SystemLetterTemplate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author LiuQun
 * @date 2020-09-28 17:10
 */
@Slf4j
@Service
public class SystemLetterTemplateHandler {
    @Resource
    private SystemLetterTemplateBusiness templateBusiness;

    @Resource
    private SystemLetterHandler letterHandler;

    @Resource
    private BatchExecutor batchExecutor;

    /**
     * 后台保存系统发送站内信
     * @param param 系统发送站内信参数
     */
    public void saveLetterTemplate(SystemLetterTemplateParam param){
        Date date = new Date();
        param.setCreateTime(date);
        param.setSendTime(date);
        templateBusiness.save(TransformUtils.transform(param, SystemLetterTemplate.class));
    }

    /**
     * 后台分页查询系统发送站内信
     * @param queryParam 查询参数
     * @return 分页结果
     */
    public Pager<SystemLetterTemplateResult> pageQuery(SystemLetterTemplateQueryParam queryParam){
        Pager<SystemLetterTemplate> pager = templateBusiness.pageQuery(queryParam, () -> templateBusiness.findLetterTemplateByParam(queryParam));
        Pager<SystemLetterTemplateResult> result = TransformUtils.transformPage(pager, SystemLetterTemplateResult.class);
        //调用方法封装系统发送站内信的未读和已读人数量，然后重新放置在分页结果中
        List<SystemLetterTemplateResult> letterTemplateList = this.packingLetterTemplates(pager.getDataList());
        result.setDataList(letterTemplateList);
        return result;
    }

    /**
     * 后台查询系统发送站内信详情
     * @param id 系统发送站内信id
     * @return 系统发送站内信结果
     */
    public SystemLetterTemplateResult findLetterTemplateDetail(Long id){
        SystemLetterTemplate letterTemplate = templateBusiness.findById(id);
        if (ObjectUtils.isEmpty(letterTemplate)) return null;
        return TransformUtils.transform(letterTemplate,SystemLetterTemplateResult.class);
    }

    /**
     * 后台更新系统发送站内信
     * @param param 系统发送站内信参数
     */
    public void updateLetterTemplate(SystemLetterTemplateParam param){
        param.setLastUpdateTime(new Date());
        templateBusiness.updateByPrimaryKeySelective(TransformUtils.transform(param,SystemLetterTemplate.class));
    }

    /**
     * 后台批量删除系统发送站内信
     * @param idList 系统发送站内信id集合
     */
    public void batchDeleteLetterTemplate(List<Long> idList){
        batchExecutor.batchExecute(idList,id -> id.toString(),(item) -> {
            //查询系统发送站内信的信息是否存储在了站内信表中，若是则不能删除，否则可以删除
            boolean existLetter = letterHandler.existsLetterByLinkId(item);
            if (existLetter){
                throw new GlobalException("SystemLetterTemplate is used");
            }else {
                templateBusiness.deleteById(item);
            }
        });
    }

    /**
     * 封装系统发送站内信的已读、未读情况到结果集中
     * @param letterTemplateList 系统发送站内信集合
     * @return 系统发送站内信结果集合
     */
    private List<SystemLetterTemplateResult> packingLetterTemplates(List<SystemLetterTemplate> letterTemplateList){
        String jsonString = JSONArray.toJSONString(letterTemplateList);
        List<SystemLetterTemplate> templateList = JSONArray.parseArray(jsonString, SystemLetterTemplate.class);
        //存储系统发送站内信的结果集
        List<SystemLetterTemplateResult> resultList = new ArrayList<>();
        //若没有查询到系统发送站内信，则返回空集合
        if (CollectionUtils.isEmpty(letterTemplateList)) return resultList;
        //遍历查询出来的系统发送站内信的结果集
        for (SystemLetterTemplate template : templateList) {
            //TODO 调用user中的RPC接口：根据查询条件(userIds、会员等级、用户层级、用户类型)统计出用户数量。
            //该数量就是这条系统发送站内信的总共接收者数量。
            Long total = 100L;//例子
            //查询出对应的站内信的已读人数：
            Long readNum = letterHandler.findReadLetterNumByLinkId(template.getId());
            //将获取的已读、未读数量封装到结果中
            SystemLetterTemplateResult templateResult = TransformUtils.transform(template, SystemLetterTemplateResult.class);
            templateResult.setReadNum(readNum);
            templateResult.setUnReadNum(total-readNum);
            resultList.add(templateResult);
        }
        return resultList;
    }

}
